import express from 'express';
import path from 'path';
import { fileURLToPath } from 'url';
import fs from 'fs';
import compression from 'compression';
import helmet from 'helmet';
import cors from 'cors';
import morgan from 'morgan';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
const PORT = process.env.FRONTEND_PORT || 8080;

// 中间件配置
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      scriptSrc: ["'self'", "'unsafe-inline'"],
      imgSrc: ["'self'", "data:"],
      fontSrc: ["'self'"]
    }
  }
}));

app.use(compression());
app.use(cors());
app.use(morgan('combined'));

// 静态文件服务 - 提供src目录下的所有文件
app.use(express.static(path.join(__dirname, 'src'), {
  index: false, // 禁用自动索引
  dotfiles: 'ignore', // 忽略点文件
  setHeaders: (res, path) => {
    // 设置正确的MIME类型
    if (path.endsWith('.css')) {
      res.setHeader('Content-Type', 'text/css');
    } else if (path.endsWith('.js')) {
      res.setHeader('Content-Type', 'application/javascript');
    }
  }
}));

// 为assets目录添加特定路由
app.use('/assets', express.static(path.join(__dirname, 'assets')));

// 为scripts目录添加特定路由
app.use('/scripts', express.static(path.join(__dirname, 'src', 'scripts'), {
  setHeaders: (res, path) => {
    if (path.endsWith('.js')) {
      res.setHeader('Content-Type', 'application/javascript');
    }
  }
}));

// 为styles目录添加特定路由
app.use('/styles', express.static(path.join(__dirname, 'src', 'styles'), {
  setHeaders: (res, path) => {
    if (path.endsWith('.css')) {
      res.setHeader('Content-Type', 'text/css');
    }
  }
}));

// 为components目录添加特定路由
app.use('/components', express.static(path.join(__dirname, 'src', 'components')));

// 为pages目录添加特定路由
app.use('/pages', express.static(path.join(__dirname, 'src', 'pages')));

// SPA路由处理 - 所有未匹配的路由重定向到登录页面
app.get('*', (req, res) => {
  // 如果是根路径，重定向到登录页面
  if (req.path === '/') {
    res.redirect('/pages/login.html');
  } else {
    // 其他路径尝试返回对应文件，如果不存在则重定向到登录页面
    const filePath = path.join(__dirname, 'src', req.path);
    if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
      res.sendFile(filePath);
    } else {
      res.redirect('/pages/login.html');
    }
  }
});

// 错误处理中间件
app.use((error, req, res, next) => {
  console.error('前端服务器错误:', error);
  res.status(500).send('服务器内部错误');
});

// 404错误处理 - 必须在所有路由之后
app.use((req, res) => {
  res.status(404).send('页面未找到');
});

app.listen(PORT, () => {
  console.log(`🚀 Node.js前端服务器运行在 http://localhost:${PORT}`);
  console.log(`📁 静态文件目录: ${path.join(__dirname, 'src')}`);
});

// 添加错误处理
process.on('uncaughtException', (error) => {
  console.error('未捕获的异常:', error);
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason);
});

export default app;